package logger

import (
	"context"
	"io"
	"os"
	"tools_go/common/constant"

	"github.com/sirupsen/logrus"
)

var (
	// version属性
	version string

	// 函数变量
	Tracef = logrus.Tracef
	Debugf = logrus.Debugf
	Infof  = logrus.Infof
	Warnf  = logrus.Warnf
	Errorf = logrus.Errorf
	Fatalf = logrus.Fatalf
	Panicf = logrus.Panicf
	Printf = logrus.Printf
	Info   = logrus.Info
	Warn   = logrus.Warn
	Debug  = logrus.Debug
	Error  = logrus.Error
)

// 类型别名
type Logger = logrus.Logger
type Entry = logrus.Entry

// Hook 定义日志钩子别名
type Hook = logrus.Hook

// StandardLogger 获取标准日志
func StandardLogger() *Logger {
	return logrus.StandardLogger()
}

// SetLevel 设定日志级别
func SetLevel(level int) {
	logrus.SetLevel(logrus.Level(level))
}

// SetFormatter 设定日志输出格式
func SetFormatter(format string) {
	switch format {
	case constant.JSON_FLG:
		logrus.SetFormatter(new(logrus.JSONFormatter))
	default:
		logrus.SetFormatter(new(logrus.TextFormatter))
	}
}

// SetOutput 设定日志输出位置
func SetOutput(out io.Writer) {
	logrus.SetOutput(out)
}

// SetVersion 设定版本
func SetVersion(v string) {
	version = v
}

// AddHook 增加日志钩子
func AddHook(hook Hook) {
	logrus.AddHook(hook)
}

type (
	traceIdKey struct{}
)

// NewTraceIDContext 创建跟踪ID上下文
func NewTraceIdContext(ctx context.Context, traceId string) context.Context {
	return context.WithValue(ctx, traceIdKey{}, traceId)
}

// FromTraceIDContext 从上下文中获取跟踪ID
func FromTraceIdContext(ctx context.Context) string {
	v := ctx.Value(traceIdKey{})
	//todo remove
	if v != nil {
		if s, ok := v.(string); ok {
			return s
		}
	}
	return ""
}

// WithContext Use context create entry
func WithContext(ctx context.Context) *Entry {
	if ctx == nil {
		ctx = context.Background()
	}

	fields := map[string]interface{}{}

	if v := FromTraceIdContext(ctx); v != "" {
		fields[constant.TRACE_ID] = v
	}
	return logrus.WithContext(ctx).WithFields(fields)
}

func init() {
	SetLevel(int(logrus.WarnLevel))
	// 设置日志格式
	SetFormatter(constant.JSON_FLG)
	SetOutput(os.Stdout)
}
